class Solution {
    public boolean isMatch(String s, String p) {
        int m = s.length();
        int n = p.length();
        s = " " + s;
        p = " " + p;
        char[] s1 = s.toCharArray();
        char[] s2 = p.toCharArray();
        boolean[][] dp = new boolean[m + 1][n + 1];
        dp[0][0] = true;
        for(int j = 1; j <= n; j++)
        {
            if(j == 2 && s2[j] == '*') dp[0][1] = dp[0][2] = true;
            if(s2[j] == '*') dp[0][j] = true;
            else break;
        }

        for(int i = 1; i <= m; i++){
            for(int j = 1; j <= n; j++){
                if(s1[i] == s2[j] || s2[j] == '.') dp[i][j] = dp[i - 1][j - 1];
                else if(s2[j] == '*') {
                    if(s2[j - 1] == s1[i] || s2[j - 1] == '.') {
                        // 匹配一个
                        dp[i][j] = dp[i - 1][j - 1] || dp[i - 1][j];
                    }
                    else dp[i][j] = dp[i][j - 2];
                }
            }
        }
        return dp[m][n];
    }
}